package prtpv;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import java.text.DecimalFormat;

public final class PagoCliente {

    String tipoCliente;
    Float totalPrimero;
    Float totalImpuestos;
    float descontado;
    float totalFinal;
    Float ingresadoPorCliente;
    Float porcentajeDescuentoAcumulado;
    float ingresado;
    Ticket tic;

    public PagoCliente(String TipoCliente, Ticket tick,
            DescuentosAplicables descAp, CompositeDescuento descuentos,
            CalculadoraImpuestos calculadora) throws MalformedURLException, IOException, SAXException, ParserConfigurationException {

        tic = tick;
        descontado=0F;


        if (!tic.cancelado) {

            totalPrimero = obtenTotalPrimero(tic);

            porcentajeDescuentoAcumulado = obtenDescuento(descuentos, descAp);

            //descontado = totalPrimero * porcentajeDescuentoAcumulado / 100F;

            totalImpuestos = obtenImpuestos(tic, calculadora,porcentajeDescuentoAcumulado, descontado);

            //totalFinal = obtenTotalFinal();
        }
    }

    float obtenTotalPrimero(Ticket tic) {
        float resultado = 0;

        for (int i = 0; i < tic.lineas.size(); i++) {
            resultado += tic.lineas.get(i).precioLineaConDesc;
        }

        return resultado;
    }

    float obtenImpuestos(Ticket tic, CalculadoraImpuestos calc, float porcentajeDto, float dtoAcum) throws MalformedURLException, IOException, SAXException, ParserConfigurationException {
        float resultado = 0;
        ArrayList<Impuesto> impuestos;
        float  descuento=0F, porcentaje=0F, impuesto;
        float precio;

        for (int i = 0; i < tic.lineas.size(); i++) {
            // Precio linea sin descuentos
            precio = tic.lineas.get(i).precioFin;
            // Calculamos el dto
            descuento = precio * porcentajeDto / 100F;
            tic.lineas.get(i).setDescuento(descuento);
            // Aplicamos el dto
            precio = precio-descuento;
            tic.lineas.get(i).setPrecioFin(precio);
            // Acumulamos precio y descuento
            totalFinal +=precio;
            descontado +=descuento;

             //System.out.println("Precio linea "+ i+ "  "+totalFinal);
             // Obtenemos array impuestos para producto codigo
            impuestos = calc.calculaImpuesto(tic.lineas.get(i).codigo);
            // sumamos los porcentaje-impuestos del array
            for (int j = 0; j < impuestos.size(); j++) {
                porcentaje += impuestos.get(j).porcentaje;
                //System.out.println("Porcentaje linea "+ i+ "  "+porcentaje);
            }
            //System.out.println("Porcentaje total: "+porcentaje);
            // Aplicamos el porcentaje a la linea y acumulamos
            float preciosinimp=(precio / (1F + porcentaje));
            impuesto=precio-preciosinimp;

            //System.out.println("PrecioFin: "+precio+"      preciosinimpuesto: "+preciosinimp);
            //System.out.println("impuesto de la linea: "+i+"  "+impuesto);
            porcentaje = 0;
            resultado += impuesto;
        }

        return resultado;
    }

    Float obtenDescuento(CompositeDescuento descuentos, DescuentosAplicables dAp) {
        Float porcentaje;
        if (dAp.politicaAplicable.equals("ACUMULABLE")) {
            porcentaje = descuentos.obtenerDescuento(tic.venta);
        } else {
            porcentaje = descuentos.maxDescuento(tic.venta).obtenerDescuento(tic.venta);
        }
        return porcentaje;
    }

    float obtenTotalFinal() {
        return totalPrimero;
        //- descontado;
    }

    float devolucion(float ingresado) {
        this.ingresado = ingresado;
        return (ingresado - obtenTotalFinal());
    }

    void imprimirTicket(Float ingreso, String nombreFicSal) throws IOException {
        PrintWriter salida = new PrintWriter(new BufferedWriter(new FileWriter(nombreFicSal)));
        DecimalFormat formateador = new DecimalFormat("###0.00");

        if (!tic.cancelado) {
            salida.println("<ticket>");
            if (!tic.esVacio()) {
                for (int i = 0; i < tic.lineas.size(); i++) {
                    salida.println("\t<linTicket>");
                    salida.print((tic.lineas.get(i)).toString());
                    salida.println("\t</linTicket>");
                }
                salida.println("\t<totalAPagar cant=\'" + formateador.format(totalFinal) + "\'/>");
                salida.println("\t<dctoAcumulado cant=\'" + formateador.format(descontado) + "\'/>");
                salida.println("\t<impuestos cant=\'" + formateador.format(totalImpuestos) + "\'/>");
            }
            salida.println("</ticket>");
        }
        salida.close();
    }
    public Float getTotalFinal()
    {
        return totalFinal;
    }
    public float getDescuentoTotal()
    {
        return descontado;
    }
    
}